package pr3.funcion;

import pr3.cromosoma.Estado;

/**
 *
 * @author Gonzalo Ortiz Jaureguizar (gortiz at software.imdea.org)
 */
public abstract class Funcion implements Cloneable {

    private Funcion padre = null;

    public abstract Object evaluar(Estado estado);

    public abstract int getAridad();

    public abstract void setArgumento(int i, Funcion arg);

    public abstract Funcion getArgumento(int i);

    public abstract Funcion clone();

    public abstract String toString(int profundidad);

    public Funcion getPadre() {
        return padre;
    }

    public void setPadre(Funcion padre) {
        this.padre = padre;
    }

    public int getProfundidad() {
        if (padre == null) {
            return 0;
        }
        return padre.getProfundidad() + 1;
    }

    public int getProfundidadSubarbol() {
        final int aridad = getAridad();
        if (aridad == 0) {
            return 0;
        }
        int prof = Integer.MIN_VALUE;
        for (int i = 0; i < aridad; i++) {
            int profHijo = getArgumento(i).getProfundidadSubarbol();
            if (profHijo > prof) {
                prof = profHijo;
            }
        }
        return prof + 1;
    }

    public static enum Terminal {

        BS, CP, SN;

        protected static Terminal getRandomTerminal() {
            switch ((int) (Math.random() * 3)) {
                case 0:
                    return BS;
                case 1:
                    return CP;
                default:
                    return SN;
            }
        }
    }
}
